package com.ruoyi.common.utils;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

/**
 * 二维码生成工具类
 * 
 * @author ruoyi
 */
public class QrCodeUtil
{
    /** 默认宽度 */
    private static final int DEFAULT_WIDTH = 300;
    
    /** 默认高度 */
    private static final int DEFAULT_HEIGHT = 300;

    /**
     * 生成二维码（返回BufferedImage）
     * 
     * @param content 二维码内容
     * @param width 宽度
     * @param height 高度
     * @return BufferedImage
     */
    public static BufferedImage generateQRCode(String content, int width, int height) throws Exception
    {
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.MARGIN, 1);

        BitMatrix bitMatrix = new MultiFormatWriter().encode(
            content,
            BarcodeFormat.QR_CODE,
            width,
            height,
            hints
        );

        return MatrixToImageWriter.toBufferedImage(bitMatrix);
    }

    /**
     * 生成二维码（使用默认尺寸）
     */
    public static BufferedImage generateQRCode(String content) throws Exception
    {
        return generateQRCode(content, DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }

    /**
     * 生成二维码并保存到文件
     * 
     * @param content 二维码内容
     * @param filePath 文件保存路径
     * @param width 宽度
     * @param height 高度
     */
    public static void generateQRCodeFile(String content, String filePath, int width, int height) throws Exception
    {
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.MARGIN, 1);

        BitMatrix bitMatrix = new MultiFormatWriter().encode(
            content,
            BarcodeFormat.QR_CODE,
            width,
            height,
            hints
        );

        Path path = new File(filePath).toPath();
        MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
    }

    /**
     * 生成二维码并保存到文件（使用默认尺寸）
     */
    public static void generateQRCodeFile(String content, String filePath) throws Exception
    {
        generateQRCodeFile(content, filePath, DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }

    /**
     * 生成二维码（返回字节数组）
     */
    public static byte[] generateQRCodeBytes(String content, int width, int height) throws Exception
    {
        BufferedImage image = generateQRCode(content, width, height);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, "PNG", baos);
        return baos.toByteArray();
    }

    /**
     * 生成二维码（返回字节数组，使用默认尺寸）
     */
    public static byte[] generateQRCodeBytes(String content) throws Exception
    {
        return generateQRCodeBytes(content, DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }
}

